#include "command_utils.h"
#include <map>
const std::map<string, cmd_type> command_map = {
    {"create", CMD_CREATE},
    {"delete", CMD_DELETE},
    {"drop", CMD_DROP},
    {"exit", CMD_EXIT},
    {"help", CMD_HELP},
    {"info", CMD_INFO},
    {"insert", CMD_INSERT},
    {"select", CMD_SELECT},
    {"use", CMD_USE},
};
/**
 * 根据命令字符串获取命令类型
 * 
 * 此函数通过遍历命令映射表来匹配给定的命令字符串，并返回对应的命令类型
 * 如果找不到匹配的命令，将抛出错误并返回CMD_EXIT
 * 
 * @param command_ 用户输入的命令字符串
 * @return 匹配到的命令类型，如果没有找到匹配的命令，则返回CMD_EXIT
 */
cmd_type get_command_type(string command_)
{
    // 遍历命令映射表，寻找匹配的命令
    for (auto &item : command_map)
    {
        // 如果找到匹配的命令，返回对应的命令类型
        if (item.first == command_)
        {
            return item.second;
        }
    }  
    // 如果没有找到匹配的命令，抛出错误并返回CMD_EXIT
    error("Invalid command");
    return CMD_EXIT;
}
/**
 * 解析命令字符串为Command结构体
 * 
 * @param cmd 待解析的命令字符串
 * @param level 命令级别，用于指示命令的重要程度
 * @return 返回一个Command结构体，包含解析出的命令类型、级别和参数
 * 
 * 本函数的主要作用是将输入的命令字符串解析为一个Command结构体
 * 它首先使用sscanf函数将命令字符串分割为命令和参数两部分
 * 然后通过调用get_command_type函数确定命令类型，并将这些信息封装到一个Command结构体中返回
 */
Command strtok_command(string cmd,cmd_level level)
{
    Command cmd_;
    
    /*缓存，sscanf无法直接写到string*/
    char buf_command[64];
    char buf_args[256];

    /*从命令字符串中解析出命令和参数*/
    sscanf(cmd.c_str(), "%s %[^\n]", buf_command, buf_args);
    
    /*写回string*/
    string command_ = buf_command;
    string args = buf_args;
    
    /*通过命令字符串获取命令类型*/
    cmd_type type = get_command_type(command_);
    /*填充Command结构体*/
    cmd_.type = type;
    cmd_.level = level;
    cmd_.args = args;
    /*返回解析后的Command结构体*/
    return cmd_;
}
